oracle数据库提供了dbms_metadata API方便用户获取创建数据库对象的DDL语句,扩展出来的用途包括对比不同数据库中对象的差异。下面先介绍dbms_metadata的简单应用

获取数据库对象创建DDL

比较通用的方法

可以使用如下pl/sql函数获取对象的DDL语句

CREATE OR REPLACE FUNCTION get_table_md
  RETURN CLOB
IS
  -- Define local variables.
  h  NUMBER; --handle returned by OPEN
  th NUMBER; -- handle returned by ADD_TRANSFORM
  doc CLOB;
BEGIN
  -- Specify the object type.
  h := DBMS_METADATA.OPEN('TABLE');
  dbms_output.put_line('H is '||h );
  -- Use filters to specify the particular object desired.
  DBMS_METADATA.SET_FILTER(h,'SCHEMA','APPLSYS');
  DBMS_METADATA.SET_FILTER(h,'NAME','FND_USER');
  -- Request that the metadata be transformed into creation DDL.
  th := DBMS_METADATA.ADD_TRANSFORM(h,'DDL');
  -- Fetch the object.
  doc := DBMS_METADATA.FETCH_CLOB(h);
  -- Release resources.
  DBMS_METADATA.CLOSE(h);
  RETURN doc;
END;
/ 

数据库中创建get_table_md函数之后,可以用以下方式获取DDL语句:

SET PAGESIZE 0
SET LONG 1000000
SELECT get_table_md from dual;

比较方便的方法

在比较新的ORACLE版本中(我观察是11.1以上),可以直接使用dbms_metadata.get_ddl方法来获取DDL语句。

SET PAGESIZE 0
SET LONG 1000000
select dbms_metadata.get_ddl('TABLE','FND_NODES','APPLSYS') from dual;

可能碰到的问题

使用dbms_metadata.get_ddl时,可能会遇到类似下面的错误

*
ERROR at line 1:
ORA-31603: object "OBJECT1" of type TYPE not found in schema "USER1"
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 105
ORA-06512: at "SYS.DBMS_METADATA", line 628
ORA-06512: at "SYS.DBMS_METADATA", line 1221
ORA-06512: at "USER2.TEST", line 4
ORA-06512: at line 1

根据MOS文章DBMS_METADATA.GET_DDL Returns Error When Select Types Ora-31603 (文档 ID 312883.1),此问题是因为用户缺少SELECT_CATALOG_ROLE角色权限导致,授予相应用户这个权限之后,问题即可解决。


花菜土豆粉
67 声望27 粉丝

Life with Oracle